///////////////////////////////////////////////////////////////////////////
// 标题：Android业务架构 · 基础篇 · Jetpack四件套
// 作者：小木箱
// 地址：https://juejin.cn/post/7207263350487924773#comment
///////////////////////////////////////////////////////////////////////////


/**
 * LifeCycle基础定义
 *
 * Android Jetpack Lifecycle是Android Jetpack组件库中的一部分，Lifecycle是基于Android Framework中的Lifecycle概念而构建的。
 * Lifecycle提供了一种轻松管理组件（如Activity和Fragment）生命周期的方式，同时也支持自定义组件的生命周期。
 * Jetpack Lifecycle提供了一组类和接口，使得开发者可以在组件的生命周期各个阶段执行相应的操作。
 * 这些类和接口包括：
 *      LifecycleOwner: 拥有生命周期的对象，通常是Activity和Fragment。
 *      LifecycleObserver: 监听组件的生命周期事件的观察者对象。
 *      Lifecycle: 组件的生命周期，包括CREATED、STARTED、RESUMED、PAUSED、STOPPED、DESTROYED等状态。
 *      LiveData: 一个可观察的数据容器，可以在组件生命周期的不同阶段更新数据。
 * */


/*示例
public class Timer implements LifecycleObserver {
    private Handler handler;
    private int seconds = 0;

    @OnLifecycleEvent(Lifecycle.Event.ON_START)public void startTimer() {
        handler = new Handler();
        handler.post(new Runnable() {
            @Overridepublic void run() {
                Log.d("Timer", "Seconds: " + seconds);
                seconds++;
                handler.postDelayed(this, 1000);
            }
        });
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)public void stopTimer() {
        handler.removeCallbacksAndMessages(null);
        handler = null;
    }
}

    在Activity中
    getLifecycle().addObserver(new Timer());
    这样，当Activity处于前台时，Timer实例中的startTimer方法会被调用，计时器会开始递增；
    当Activity被销毁时，Timer实例中的stopTimer方法会被调用，计时器会停止。
    这个例子展示了如何使用Jetpack LifeCycle组件来管理App组件的生命周期。
    当App中存在需要在组件生命周期不同阶段执行的操作时，使用LifeCycle可以更方便地实现这些操作，同时避免了一些常见的生命周期问题。
*/

/*
LifecycleOwner表示拥有生命周期的组件，比如Activity和Fragment。
Lifecycle表示组件的生命周期，LifecycleObserver表示一个组件的生命周期观察者。
LifecycleRegistry是Lifecycle接口的一个实现类，它维护了一个生命周期状态机，用于记录组件的生命周期状态和生命周期事件。
LifecycleRegistry提供了一系列方法，用于管理组件的生命周期状态和生命周期事件。当组件的生命周期事件发生变化时，LifecycleRegistry会自动更新状态机，并通知所有的LifecycleObserver观察者对象，以便它们可以相应地更新自己的状态。
LifecycleOwner可以通过getLifecycle()方法获取到一个Lifecycle对象，然后将自己的生命周期观察者对象添加到Lifecycle对象中，从而实现对组件生命周期的监听。
当组件的生命周期事件发生变化时，Lifecycle会自动通知所有的生命周期观察者对象，以便它们可以相应地更新自己的状态。

**Lifecycle库的核心是Lifecycle接口和LifecycleObserver接口。
Lifecycle接口定义了一组方法，用于将LifecycleOwner与LifecycleObserver进行关联。
LifecycleObserver接口定义了一组回调方法，用于接收LifecycleOwner的生命周期事件。
在Lifecycle库的实现中，Lifecycle接口有两个重要的实现类，分别是LifecycleRegistry和LifecycleOwner。
LifecycleRegistry实现了Lifecycle接口，并提供了一组方法，用于管理LifecycleOwner的生命周期状态。
LifecycleOwner是一个接口，用于标识拥有生命周期状态的对象，通常是Activity或Fragment。
在LifecycleRegistry中，有一个名为mObserverMap的成员变量，用于存储LifecycleObserver对象和其关联的EventObserver对象。
当LifecycleOwner的生命周期状态更改时，LifecycleRegistry会自动调用mObserverMap中与之相关联的EventObserver对象的相应方法，以便它们可以执行适当的操作。
在LifecycleRegistry中，有一个名为mObserverMap的成员变量，用于存储LifecycleObserver对象和其关联的EventObserver对象。
当LifecycleOwner的生命周期状态更改时，LifecycleRegistry会自动调用mObserverMap中与之相关联的EventObserver对象的相应方法，以便它们可以执行适当的操作。
*/

/*ifeCycle注意事项
不要在 onCreate() 方法中使用 Lifecycle 组件
Lifecycle 组件在 onCreate() 方法中尚未初始化完成，因此在该方法中使用它们可能会导致崩溃或不可预测的行为。建议在 onStart() 方法中使用 Lifecycle 组件。

不要手动调用 onDestroy() 方法
手动调用 onDestroy() 方法会破坏 Lifecycle 组件的生命周期，从而导致应用程序行为异常。Lifecycle 组件应该由系统自动管理，应该避免手动干预。

避免在 Fragment 中使用多个 LifecycleOwner
Fragment 自身就是一个 LifecycleOwner，因此不应该在 Fragment 中创建其他的 LifecycleOwner。这样会导致多个 LifecycleOwner 之间的状态不同步，从而导致应用程序出现问题。
*/